package code15.io;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class TestRandomAccessFile {

	public static void main(String[] args) {
		f1();
	}

	private static void f1() {
		/*
		 * mode 访问模式, 常用的有:
		 * "r" : 只读
		 * "rw" : 读写
		 * 当文件不存在时:
		 *   如果模式为 r, 则会抛出 FileNotFoundException
		 *   如果模式为 rw, 会自动创建对应的文件
		 */
		try (
				RandomAccessFile raf = new RandomAccessFile("src/code15/io/word.txt", "rw");
				) {
			// 获取当前指针所在的位置, 从0开始.
			long pointer = raf.getFilePointer();
			System.out.println("pointer:"+pointer);
			// 一次写一个字节, 会在对应位置写入字节, 如果对应位置已存在内容, 则会被覆盖
			raf.write('X');// 不能写中文字符, GBK 2个字节, UTF-8 3个字节
			// 一次写多个字节
			raf.write("测".getBytes("UTF-8"));
			System.out.println("pointer:" + raf.getFilePointer());
			
			// 将指针移动到指定的位置(字节)
			raf.seek(16);// 在文件内容的范围内 移动
			raf.write('X');
			System.out.println("pointer:" + raf.getFilePointer());
			
			// 将指针移动到指定的位置(字节)
			raf.seek(30);// 可以超出文件大小
			raf.write("测试".getBytes("UTF-8"));
			raf.write('\0');
			System.out.println("pointer:" + raf.getFilePointer());
			
			// 移动到文件开头
			raf.seek(0);
			// 一次读取一个字节
			int read = raf.read();
			System.out.println((char) read);// X
			byte[] buffer = new byte[100];
			// 读取多个字节, 返回实际读取到的字节数
			int len = raf.read(buffer);
			System.out.println("内容:" + new String(buffer, 0, len));
			
			// 移动到文件开头
			raf.seek(0);
			
			// 将指针向后, 跳过指定个数个 字节, 只能向后移动, 不能向前移动
			int skipBytes1 = raf.skipBytes(13);// 返回实际跳过的字节数, 即 不会超出文件大小
			System.out.println("skipBytes1:"+skipBytes1);
			System.out.println((char) raf.read());
			
			int skipBytes2 = raf.skipBytes(50);// 50 超出了文件大小
			System.out.println("skipBytes2:"+skipBytes2);
			System.out.println("read:" + raf.read());// -1 读到文件的末尾了
			
			// 设置文件内容的长度(文件大小)
			raf.setLength(20);// 比 原始文件大小 要 小, 会删除后面的内容
			
			raf.setLength(50);// 比 原始文件大小 要 大, 会扩展文件内容
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}
